perm filename IO[GEO,BGB] blob sn#086508 filedate 1974-02-07 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00012 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00003 00002	TITLE IO - GEM INPUT/OUTPUT - BGB - FEBRUARY 1973.
C00005 00003	SUBR(PLOTO)	DISPLAY BUFFER TO DISK FILE.
C00008 00004	SUBR(GETFIL,EXT)	SETUP FILE SPEC FROM TTY LINE.
C00010 00005	SUBR(SERIAL,BODY)	SERIAL NUMBER THE ALT LINKS OF A BODY.
C00012 00006	SUBR(OFEV,BODY)		OUTPUT THE FEV OF A BODY.
C00015 00007	SUBR(OUTB3D,BODY)	OUTPUT B3D BODY.
C00017 00008	SUBR(ICAM)		INPUT CAMERA.
C00019 00009	SUBR(OCAM)		OUTPUT CAMERA.
C00021 00010	SUBR(IFEV,BODY)		INPUT F.E.V. BLOCKS.
C00024 00011	SUBR(IBODY,BODY0)	INPUT A BODY AND ALL ITS PARTS.
C00026 00012	SUBR(INB3D)		INPUT B3D FORMAT.
C00028 ENDMK
C⊗;
TITLE IO - GEM INPUT/OUTPUT - BGB - FEBRUARY 1973.

EXTERN MKB,MKF,MKE,MKV,MKFRAME,BATT,FCCW

	↓CMDCHN←←16
	↓IODEND←20000
	FILNAM:0	;FILE NAME.
	EXTION:0↔0	;EXTENSION.
	PPPN:0		;PROJECT-PROGRAMMER.
	
	OBUF:BLOCK 3	;OUTPUT BUFFER HEADER.
	IBUF:BLOCK 3	;INPUT BUFFER HEADER.
	CMDHDR:	BLOCK 3	;COMMAND BUFFER HEADER
	EOF:	0	;END OF FILE FLAG.
	GEMFLG:	0	;KIND OF FILE FORMAT 0 FOR B3D, -1 FOR GEM.
				;+1 FOR GEM CALLED BY SAIL.
	CMDBUF:	BLOCK 2*(201+2)

	BLOCK 3
	BFRAME:BLOCK 9	;BODY FRAME BUFFER.
	
	PCNT:0		;PARTS COUNT.
	FCNT:0		;FACE COUNT.
	ECNT:0		;EDGE COUNT.
	VCNT:0		;VERTEX COUNT.

	PLTFLG↑: 0	;SET DURING PLOT OUTPUT TO DISABLE III KLUDGES

SUBR(WORDO,WORD)	;WORD OUTPUT.
COMMENT ⊗------------------------------------------------------------
⊗
	LAC WORD
	SOSG OBUF+2↔OUT 1,0
	GO[IDPB 0,OBUF+1↔POP1J]
	FATAL(WORDO)
ENDR;2/18/73(BGB)----------------------------------------------------

WORDIN: ;----------------------------------------------------------
BEGIN WORDIN; WORD INPUT TO AC0 - BGB - 18 FEBRUARY 1973.
	SOSG IBUF+2↔IN 1,0
	GO[ILDB 0,IBUF+1↔POPJ P,]
	STATO 1,1B22↔GO[FATAL(WORDIN)]
	SETOM EOF↔POPJ P,
BEND;2/18/73(BGB)--------------------------------------------------
SUBR(PLOTO)	;DISPLAY BUFFER TO DISK FILE.
COMMENT ⊗------------------------------------------------------------
⊗
	EXTERN DPYBUF,GEODPY
	SETOM PLTFLG
	CALL(GEODPY)
	SETZM PLTFLG
	CALL(GETFIL,[SIXBIT/PLT/])↔POP0J
	LAC 1,DPYBUF↔LACN(1)1↔SUBI 2
	CDR 2,(1)↔SETZM 1(2)
	MOVS↔LAPI -1(1)↔DAC DUMLST
	INIT 1,17↔SIXBIT/DSK/↔0↔HALT
	ENTER 1,FILNAM↔GO .+4
	OUT 1,DUMLST↔JFCL
	OUTSTR[ASCIZ"	EOF.
"]↔	RELEASE 1,
	POP0J
DUMLST:	0↔0
ENDR PLOTO;12/10/72(BGB)---------------------------------------------

SUBR(IGEM)		
	POP 16,STRING↔POP 16,0↔DAPZ STRCNT
	AOS GEMFLG↔CALL(INB3D)↔SETZM GEMFLG↔POP0J
ENDR IGEM;8/27/73(BGB)-----------------------------------------------

SUBR(OGEM,BODY)
	POP 16,STRING↔POP 16,0↔DAPZ STRCNT
	AOS GEMFLG↔CALL(OUTB3D,BODY)↔SETZM GEMFLG↔POP1J
ENDR OGEM;8/27/73(BGB)-----------------------------------------------

	STRING:0	;STRING BYTE POINTER.
	STRCNT:0	;STRING BYTE COUNT.
SUBR(GETFIL,EXT)	;SETUP FILE SPEC FROM TTY LINE.
COMMENT ⊗------------------------------------------------------------
⊗
	DZM FILNAM
	DZM EXTION
	DZM EXTION+1
	DZM PPPN

L0:	LAC 1,[POINT 6,FILNAM,-1]↔LACI 2,6
	CALL(GETCL0)
	CAIL"a"↔SUBI 40
	CAIN 15↔GO[INCHWL↔POP1J]↔AOSA(P)

L:	CALL(GETCL0)↔CAIL"a"↔SUBI 40
	CAIN"."↔GO[SETZM ARG1↔LAC 1,[POINT 6,EXTION,-1]↔LACI 2,3↔GO L]
	CAIN"["↔GO[LAC 1,[POINT 6,PPPN,-1]  ↔LACI 2,3↔GO L]
	CAIN","↔GO[LAC 1,[POINT 6,PPPN,17]  ↔LACI 2,3↔GO L]
	CAIN"]"↔GO L

	CAIN 15↔GO EOL			;END OF THE LINE.
	CAIN 12↔GO EOL
	JUMPE EOL	;NULLS.
	CAIG" "↔GO L	;IGNORE GARBAGE.
	SOJL 2,L
	SUBI 40↔IDPB 1↔GO L	;ASCII TO SIXBIT.

EOL:	CALL(GETCL0)
	CAR PPPN
	TRNN 77↔LSH -6↔TRNN 77↔LSH -6    ;RIGHT ADJUST PROJECT.
	DIP PPPN
	CDR PPPN
	TRNN 77↔LSH -6↔TRNN 77↔LSH -6    ;RIGHT ADJUST PROGRAMMER.
	DAP PPPN
	SKIPN 1,EXTION↔LAC 1,ARG1↔DAC 1,EXTION ;DEFAULT EXTENSION.
	POP1J
ENDR GETFIL;2/18/73(BGB)---------------------------------------------
GETCL0:	
	SETZ↔SOSL STRCNT↔ILDB STRING↔POPJ P,	;LOP THE STRING.
SUBR(SERIAL,BODY)	;SERIAL NUMBER THE ALT LINKS OF A BODY.
COMMENT ⊗------------------------------------------------------------
⊗
	LAC 1,BODY↔TEST 1,BBIT↔POP1J

;COUNT FACES, EDGES, AND VERTICES.
	LACI 1↔PFACE 1,1↔ALT. 0,1↔CAME 1,ARG1↔AOJA .-3↔SOS↔DAC FCNT
	LACI 1↔PED   1,1↔ALT. 0,1↔CAME 1,ARG1↔AOJA .-3↔SOS↔DAC ECNT
	LACI 1↔PVT   1,1↔ALT. 0,1↔CAME 1,ARG1↔AOJA .-3↔SOS↔DAC VCNT

;COUNT PARTS.
	SETZ↔SON 1,1↔DAC 1,2↔JUMPE 1,.+5↔AOS
	BRO 2,2↔CAME 1,2↔AOJA .-2
	DAC PCNT

;OUTPUT BODY HEADER.
	CALL(WORDO,PCNT)
	CALL(WORDO,FCNT)
	CALL(WORDO,ECNT)
	CALL(WORDO,VCNT)
	LAC 1,ARG1
	CALL(WORDO,{-2(1)})	;PNAME.
	CALL(WORDO,{-1(1)})	;PNAME.
	SKIPN GEMFLG↔GO L0
	CALL(WORDO,{0(1)})	;BODY TYPE BITS.
	CALL(WORDO,{8(1)})	;USER'S BODY WORD.

;BODIES LOCATION ORIENTATION MATRIX.
L0:	FRAME 1,1↔SKIPN 1↔LACI 1,L2		;BODY'S FRAME OR EMPTY.
	LACI 2,=12↔SUBI 1,3
L1:	CALL(WORDO,{(1)})↔AOS 1↔SOJG 2,L1
	POP1J
	BLOCK 3		;EMPTY FRAME.
L2:	BLOCK 9
ENDR SERIAL;2/18/73(BGB)---------------------------------------------
SUBR(OFEV,BODY)		;OUTPUT THE FEV OF A BODY.
COMMENT ⊗------------------------------------------------------------
⊗
	LAC 1,BODY
L1:	PFACE 1,1↔CAMN 1,ARG1↔GO L2
	CALL(WORDO,{4(1)})	;FIRST FACE DATA WORD  -  REFLECTIVITIES.
	CALL(WORDO,{5(1)})	;SECOND FACE DATA WORD -  ILLUMINOUSITIES.
	SKIPN GEMFLG↔GO L1
	CALL(WORDO,{0(1)})	;FACE TYPE BITS.
	CALL(WORDO,{8(1)})	;USER'S FACE WORD.
	GO L1

L2:	PED 1,1↔CAMN 1,ARG1↔GO L3	;OUTPUT EDGE NODES.
	NFACE 2,1↔ALT 2,2↔DIP 2,0
	PFACE 2,1↔ALT 2,2↔DAP 2,0↔CALL(WORDO,0)
	NVT   2,1↔ALT 2,2↔DIP 2,0
	PVT   2,1↔ALT 2,2↔DAP 2,0↔CALL(WORDO,0)
	NCW   2,1↔ALT 2,2↔DIP 2,0
	PCW   2,1↔ALT 2,2↔DAP 2,0↔CALL(WORDO,0)
	NCCW  2,1↔ALT 2,2↔DIP 2,0
	PCCW  2,1↔ALT 2,2↔DAP 2,0↔CALL(WORDO,0)
	SKIPN GEMFLG↔GO L2
	CALL(WORDO,{0(1)})	;EDGE TYPE BITS.
	CALL(WORDO,{8(1)})	;USERS EDGE WORD.
	GO L2

L3:	PVT 1,1↔CAMN 1,ARG1↔POP1J	;OUTPUT VERTEX NODES.
	CALL(WORDO,{XWC(1)})
	CALL(WORDO,{YWC(1)})
	CALL(WORDO,{ZWC(1)})
	SKIPN GEMFLG↔GO L3
	CALL(WORDO,{0(1)})	;VERTEX TYPE BITS.
	CALL(WORDO,{8(1)})	;USERS VERTEX WORD.
	GO L3
ENDR OFEV;2/18/73(BGB)-----------------------------------------------

SUBR(OBODY,BODY)	;OUTPUT BODY AND ITS PARTS.
COMMENT ⊗------------------------------------------------------------
⊗
	ACCUMULATORS{N,B}
	CALL(SERIAL,BODY)		;SERIAL NUMBER THE F.E.V.
	CALL(OFEV,BODY)			;OUTPUT THE F.E.V.
	LAC B,BODY
	SON N,B↔JUMPE N,L2		;EXIT - AIN'T GOT NO PARTS.
L1:	PUSHP N↔CALL(OBODY,N)		;RECURSE - ON SUB PARTS.
	POPP N↔LAC B,BODY
	BRO N,N↔SON 0,B
	CAME 0,N↔GO L1
L2:	POP1J

ENDR OBODY;2/18/73(BGB)----------------------------------------------
SUBR(OUTB3D,BODY)	;OUTPUT B3D BODY.
COMMENT ⊗------------------------------------------------------------
⊗
	EXTERN DPYBUF
	LAC 1,BODY↔TEST 1,BBIT↔POP1J			;BODIES ONLY.
	SLACI'GEM'↔SKIPN GEMFLG↔SLACI'B3D'		;GEM OR B3D.
L1:	CALL(GETFIL,0)↔POP1J				;GET FILE NAME.
	INIT 1,10↔SIXBIT/DSK/↔XWD OBUF,0↔HALT
	ENTER 1,FILNAM↔GO[RELEASE 1,
		OUTSTR[ASCIZ/ ENTER FAILED./]
		CRLF↔POP1J]

;SETUP OUTPUT BUFFERS.
	PUSHP 121			;SAVE.
	LAC DPYBUF↔ADDI 20↔DAC 121
	OUTBUF 1,

;OUTPUT TRANSFER.
	CALL(OBODY,BODY)

;END OF FILE.
	RELEASE 1,
	SKIPG GEMFLG↔OUTSTR[ASCIZ/	EOF./]
	POPP 121↔POP1J			;RESTORE.
ENDR OUTB3D;2/18/73(BGB)---------------------------------------------
SUBR(ICAM)		;INPUT CAMERA.
COMMENT ⊗------------------------------------------------------------
⊗
	C←←10↔R←←11	;CAMERA & FRAME.
	POP 16,STRING↔POP 16,0↔DAPZ STRCNT
	TDZA 1,1
L1:	RELEASE 1,↔CALL(GETFIL,[SIXBIT/CAM/])↔GO[SETZ 1,↔POP0J]
	INIT 1,10↔SIXBIT/DSK/↔IBUF↔HALT
	LOOKUP 1,FILNAM↔GO L1
	PUSH P,121↔LAC DPYBUF↔ADDI 20↔DAC 121↔INBUF 1,
;FETCH NOW CAMERA.
	LAC C,UNIVERSE↑↔NWRLD C,C
	NCAMR C,C↔FRAME R,C↔CALL(KLNODE↑,R)

;INPUT TRANSFER.
	CALL(WORDIN)↔FMPR FEET↔PUSH P,0	;CX
	CALL(WORDIN)↔FMPR FEET↔PUSH P,0	;CY
	CALL(WORDIN)↔FMPR FEET↔PUSH P,0	;CZ

	CALL(WORDIN)↔PUSH P,0	;PAN
	CALL(WORDIN)↔PUSH P,0	;TILT
	CALL(WORDIN)↔PUSH P,0	;SWING

	CALL(MKROT1↑)↔FRAME. 1,C
	POP P,ZWC(1)↔POP P,YWC(1)↔POP P,XWC(1)
	CALL(WORDIN)↔FMPR FEET↔DAC 1(C)		;PDX
	CALL(WORDIN)↔FMPR FEET↔DAC 2(C)		;PDY
	CALL(WORDIN)↔FMPR FEET↔DAC 3(C)		;PDZ
	CALL(WORDIN)↔FMPR FEET↔DAC 1		;FOCAL
	LACN 1↔FDVR 1(C)↔DAC -3(C)	;SCALEX
	LACN 1↔FDVR 2(C)↔DAC -2(C)	;SCALEY
	LACN 1↔FDVR 3(C)↔DAC -1(C)	;SCALEZ
	DAC  1,3(C)		;FOCAL

;END OF FILE.
	RELEASE 1,↔POP P,121
	POP0J↔FEET:3.280833	;FEET PER METER.
ENDR ICAM;2/21/73(BGB)-----------------------------------------------
SUBR(OCAM)		;OUTPUT CAMERA.
COMMENT ⊗------------------------------------------------------------
⊗
	C←←10↔R←←11	;CAMERA & FRAME.
L1:	CALL(GETFIL,[SIXBIT/CAM/])↔POP0J
	INIT 1,10↔SIXBIT/DSK/↔XWD OBUF,0↔HALT
	ENTER 1,FILNAM↔GO[RELEASE 1,
	OUTSTR[ASCIZ/ ENTER FAILED./]↔CRLF↔POP0J]
	PUSH P,121↔LAC DPYBUF↑↔ADDI 20↔DAC 121↔OUTBUF 1,
;FETCH NOW CAMERA.
	LAC 1,UNIVERSE↑↔NWRLD 1,1
	NCAMR C,1↔FRAME R,C
;OUTPUT TRANSFER.
	LAC -3(R)↔FMPR METERS↔CALL(WORDO,0)	;CX
	LAC -2(R)↔FMPR METERS↔CALL(WORDO,0)	;CY
	LAC -1(R)↔FMPR METERS↔CALL(WORDO,0)	;CZ
	SETQ(TILT,{ACOS↑,{KZ(R)}})↔LACN KY(R)	;TILT ← ACOS(KZ).
	SETQ(PAN,{ATAN2↑,{KX(R)},0})		;PAN  ← ATAN2(KX,-KY).
	CALL(SIN↑,TILT)↔LAC JZ(R)
	JUMPE 1,.+4↔FDVR 0,1
	SETQ(SWING,{ACOS↑,0})			;SWING ← ACOS(JZ/SIN(TILT))
	CALL(WORDO,PAN)
	CALL(WORDO,TILT)
	CALL(WORDO,SWING)
	LAC 1(C)↔FMPR METERS↔CALL(WORDO,0)	;PDX
	LAC 2(C)↔FMPR METERS↔CALL(WORDO,0)	;PDY
	LAC 2(C)↔FMPR METERS↔CALL(WORDO,0)	;PDZ
	LAC 3(C)↔FMPR METERS↔CALL(WORDO,0)	;FOCAL
	RELEASE 1,↔OUTSTR[ASCIZ/	EOF.
*/]↔	POP P,121↔POP0J
DECLARE{PAN,TILT,SWING}
METERS:	0.3048006		;FEET/METER.
ENDR OCAM;2/18/73----------------------------------------------------
SUBR(IFEV,BODY)		;INPUT F.E.V. BLOCKS.
COMMENT ⊗------------------------------------------------------------
⊗
	ACCUMULATORS{F,E,V,A,I,J,FACE,EDGE,VERTEX}

;SETUP BASE POINTER TO SERIAL TABLES.
	SLACI I↔LAP 121
	DAC FACE↔DAC EDGE↔DAC VERTEX
	ADD VERTEX,FCNT
	
;MAKE AND INPUT FACES.
	LACI I,1
L1:	CALL(MKF,ARG1)↔DAC 1,@FACE
	CALL(WORDIN)↔DAC 4(1)		;FACE REFLECTIVITY.
	CALL(WORDIN)↔DAC 5(1)		;FACE LUMENOSITY.
	SKIPN GEMFLG↔GO L1A
	CALL(WORDIN)↔DAC 0(1)		;FACE TYPE BITS.
	CALL(WORDIN)↔DAC 8(1)		;FACE USER WORD.
L1A:	CAME I,FCNT↔AOJA I,L1

;MAKE AND INPUT EDGES.
	LACI I,1
L2:	CALL(MKE,ARG1)↔DIP 1,@EDGE
	CALL(WORDIN)↔DAC 1(1)		;EDGE'S WINGS.
	CALL(WORDIN)↔DAC 3(1)
	CALL(WORDIN)↔DAC 4(1)
	CALL(WORDIN)↔DAC 5(1)
	SKIPN GEMFLG↔GO L2A
	CALL(WORDIN)↔DAC 0(1)		;EDGE TYPE BITS.
	CALL(WORDIN)↔DAC 8(1)		;EDGE USER WORD.
L2A:	CAME I,ECNT↔AOJA I,L2

;MAKE AND INPUT VERTICES.
	LACI I,1
L3:	CALL(MKV,ARG1)↔DAP 1,@VERTEX
	CALL(WORDIN)↔DAC XWC(1)		;VERTEX WORLD LOCUS.
	CALL(WORDIN)↔DAC YWC(1)
	CALL(WORDIN)↔DAC ZWC(1)
	SKIPN GEMFLG↔GO L3A
	CALL(WORDIN)↔DAC 0(1)		;VERTEX TYPE BITS.
	CALL(WORDIN)↔DAC 8(1)		;VERTEX USER WORD.
L3A:	CAME I,VCNT↔AOJA I,L3

;CONVERT SERIAL NUMBERS TO NODE ADDRESSES.
	LACI J,1
L4:	LAC I,J↔CAR E,@EDGE

	NFACE I,E↔CDR F,@FACE↔NFACE. F,E↔PED. E,F
	PFACE I,E↔CDR F,@FACE↔PFACE. F,E↔PED. E,F
	NVT I,E↔CDR V,@VERTEX↔NVT. V,E↔PED. E,V
	PVT I,E↔CDR V,@VERTEX↔PVT. V,E↔PED. E,V
	NCW I,E↔CAR A,@EDGE↔NCW. A,E
	PCW I,E↔CAR A,@EDGE↔PCW. A,E
	NCCW I,E↔CAR A,@EDGE↔NCCW. A,E
	PCCW I,E↔CAR A,@EDGE↔PCCW. A,E
	CAME J,ECNT↔AOJA J,L4↔POP1J
ENDR IFEV;2/18/73(BGB)-----------------------------------------------
SUBR(IBODY,BODY0)	;INPUT A BODY AND ALL ITS PARTS.
COMMENT ⊗------------------------------------------------------------
⊗
	ACCUMULATORS{N,B,B0}

;INPUT BODY HEADER.

	CALL(WORDIN)↔DAC PCNT
	CALL(WORDIN)↔DAC FCNT
	CALL(WORDIN)↔DAC ECNT
	CALL(WORDIN)↔DAC VCNT

;INPUT THE FEV SHELL OF THIS BODY.

	SETQ(B1,{MKB,ARG1})
	LAC B0,ARG1
	JUMPN B0,[CALL(BATT,B1,B0)↔GO .+1]
	LAC B,B1
	CALL(WORDIN)↔DAC -2(B)	;PNAME.
	CALL(WORDIN)↔DAC -1(B)	;PNAME.
	SKIPN GEMFLG↔GO L1A
	CALL(WORDIN)↔DAC 0(1)		;BODY TYPE BITS.
	CALL(WORDIN)↔DAC 8(1)		;BODY USER WORD.
L1A:
;INPUT THE LOCATION ORIENTATION OF THIS BODY.

	LACI 1,BFRAME-3↔LACI 2,=12↔SETZ 4,
L1:	CALL(WORDIN)↔DAC(1)↔IORM 4↔AOS 1↔SOJG 2,L1
	SKIPE 1,4↔CALL(MKFRAME)
	FRAME. 1,B↔JUMPE 1,.+4
	SLACI BFRAME-3↔LAPI XWC(1)↔BLT KZ(1)
	CALL(IFEV,B)
	LAC B,B1↔SKIPN ARG1↔DAC B,ARG1 ;RETURN VALUE TO TOP LEVEL.

;INPUT THE PARTS OF THIS BODY.
L2:	SOSGE PCNT↔POP0J
	PUSH P,PCNT↔PUSH P,B
	CALL(IBODY)
	POP P,B↔POP P,PCNT↔GO L2
B1:0
ENDR IBODY;2/18/73(BGB)----------------------------------------------
SUBR(INB3D)		;INPUT B3D FORMAT.
COMMENT ⊗------------------------------------------------------------
⊗
	TDZA 1,1
L1:	RELEASE 1,
	SLACI'GEM'↔SKIPN GEMFLG↔SLACI'B3D'	;GEM OR B3D.
	CALL(GETFIL,0)↔GO[SETZ 1,↔POP0J]
	INIT 1,10↔SIXBIT/DSK/↔IBUF↔HALT
	LOOKUP 1,FILNAM↔GO[
	SKIPG GEMFLG↔GO L1
	OUTSTR[ASCIZ/FILE NOT FOUND./]
	RELEASE 1,↔SETZ 1,↔POP0J] ;SAILOR'S LOSE HERE.

;SETUP INPUT BUFFERS.
	PUSHP 121
	LAC DPYBUF↔ADDI 20↔DAC 121
	INBUF 1,

;INPUT TRANSFER.
	CALL(IBODY,[0])↔POP P,1

;END OF FILE.
	RELEASE 1,↔POPP 121
	SKIPG GEMFLG↔OUTSTR[ASCIZ/	EOF./]
	POP0J
ENDR INB3D;2/18/73(BGB)----------------------------------------------
END
IO.FAI - EOF.